package co.yixiang.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 配置Web MVC相关属性，包括跨域请求处理和静态资源映射。
 */
@Configuration(proxyBeanMethods = false)
@EnableWebMvc
public class ConfigurerAdapter implements WebMvcConfigurer {

    @Value("${file.path}")
    private String path;

    @Value("${file.avatar}")
    private String avatar;

    @Bean
    public CorsFilter corsFilter() {
        /**
         * 创建并返回CORS过滤器Bean，配置允许的跨域请求参数。
         * @return 配置好的CORS过滤器实例
         */
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();

        // 允许跨域请求携带凭证（如cookies）
        config.setAllowCredentials(true);

        // 允许所有来源的请求
        config.addAllowedOriginPattern("*");

        // 允许所有请求头
        config.addAllowedHeader("*");

        // 设置预检请求的最大缓存时间（18000秒）
        config.setMaxAge(18000L);

        // 允许的HTTP方法
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");

        // 将配置应用到所有路径
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * 配置静态资源处理路径，将前端请求映射到指定的文件系统路径或类路径资源。
         * @param registry 资源处理器注册器
         */
        String avatarUtl = "file:" + avatar.replace("\\","/");
        String pathUtl = "file:" + path.replace("\\","/");

        // 映射头像资源路径到文件系统路径，禁用缓存
        registry.addResourceHandler("/avatar/**").addResourceLocations(avatarUtl).setCachePeriod(0);

        // 映射文件资源路径到配置路径，禁用缓存
        registry.addResourceHandler("/file/**").addResourceLocations(pathUtl).setCachePeriod(0);

        // 映射所有其他请求到类路径资源，禁用缓存
        registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0);
    }
}
